home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume29 / zsh2.2 / part10 < prev    next >
Encoding:
Text File  |  1992-05-13  |  49.0 KB  |  2,285 lines

  1. Newsgroups: comp.sources.misc
  2. From: pfalstad@phoenix.Princeton.EDU (Paul Falstad)
  3. Subject:  v29i106:  zsh2.2 - The Z shell, Part10/17
  4. Message-ID: <1992May13.160505.9956@sparky.imd.sterling.com>
  5. X-Md4-Signature: f7a695d26e7d4697f97e21aee6cf1c8e
  6. Date: Wed, 13 May 1992 16:05:05 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: pfalstad@phoenix.Princeton.EDU (Paul Falstad)
  10. Posting-number: Volume 29, Issue 106
  11. Archive-name: zsh2.2/part10
  12. Environment: BSD
  13. Supersedes: zsh2.1: Volume 24, Issue 1-19
  14.  
  15. #!/bin/sh
  16. # this is aa.10 (part 10 of zsh2.2)
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file zsh2.2/src/lex.c continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 10; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test ! -f _shar_wnt_.tmp; then
  33.     echo 'x - still skipping zsh2.2/src/lex.c'
  34. else
  35. echo 'x - continuing file zsh2.2/src/lex.c'
  36. sed 's/^X//' << 'SHAR_EOF' >> 'zsh2.2/src/lex.c' &&
  37. X#define LX1_INPAR 7
  38. X#define LX1_OUTPAR 8
  39. X#define LX1_INBRACE 9
  40. X#define LX1_OUTBRACE 10
  41. X#define LX1_INBRACK 11
  42. X#define LX1_OUTBRACK 12
  43. X#define LX1_INANG 13
  44. X#define LX1_OUTANG 14
  45. X#define LX1_OTHER 15
  46. X
  47. X#define LX2_BREAK 0
  48. X#define LX2_OUTPAR 1
  49. X#define LX2_BAR 2
  50. X#define LX2_STRING 3
  51. X#define LX2_INBRACK 4
  52. X#define LX2_OUTBRACK 5
  53. X#define LX2_TILDE 6
  54. X#define LX2_INPAR 7
  55. X#define LX2_INBRACE 8
  56. X#define LX2_OUTBRACE 9
  57. X#define LX2_OUTANG 10
  58. X#define LX2_INANG 11
  59. X#define LX2_EQUALS 12
  60. X#define LX2_BKSLASH 13
  61. X#define LX2_QUOTE 14
  62. X#define LX2_DQUOTE 15
  63. X#define LX2_BQUOTE 16
  64. X#define LX2_OTHER 17
  65. X
  66. Xunsigned char lexact1[256],lexact2[256],lextok2[256];
  67. X
  68. Xvoid initlextabs() /**/
  69. X{
  70. Xint t0;
  71. Xstatic char *lx1 = "\\q\n;!&|(){}[]<>xx";
  72. Xstatic char *lx2 = "x)|$[]~({}><=\\\'\"`x";
  73. X
  74. X    for (t0 = 0; t0 != 256; t0++) {
  75. X        lexact1[t0] = LX1_OTHER;
  76. X        lexact2[t0] = LX2_OTHER;
  77. X        lextok2[t0] = t0;
  78. X    }
  79. X    for (t0 = 0; lx1[t0]; t0++)
  80. X        if (lx1[t0] != 'x')
  81. X            lexact1[lx1[t0]] = t0;
  82. X    for (t0 = 0; lx2[t0]; t0++)
  83. X        if (lx2[t0] != 'x')
  84. X            lexact2[lx2[t0]] = t0;
  85. X    lexact2[';'] = LX2_BREAK;
  86. X    lexact2['&'] = LX2_BREAK;
  87. X    lextok2[','] = Comma;
  88. X    lextok2['*'] = Star;
  89. X    lextok2['?'] = Quest;
  90. X    lextok2['{'] = Inbrace;
  91. X    lextok2['['] = Inbrack;
  92. X    lextok2['$'] = String;
  93. X}
  94. X
  95. X/* initialize lexical state */
  96. X
  97. Xvoid lexinit() /**/
  98. X{
  99. X    incond = incasepat = nocorrect =
  100. X        dbparens = alstat = lexstop = 0;
  101. X    incmdpos = 1;
  102. X    tok = ENDINPUT;
  103. X    if (isset(EXTENDEDGLOB))
  104. X        {
  105. X        lextok2['#'] = Pound;
  106. X        lextok2['^'] = Hat;
  107. X        }
  108. X    else
  109. X        {
  110. X        lextok2['#'] = '#'; 
  111. X        lextok2['^'] = '^';
  112. X        }
  113. X}
  114. X
  115. Xint len = 0,bsiz = 256;
  116. Xchar *bptr;
  117. X
  118. X/* add a char to the string buffer */
  119. X
  120. Xvoid add(c) /**/
  121. Xint c;
  122. X{
  123. X    *bptr++ = c;
  124. X    if (bsiz == ++len)
  125. X        {
  126. X        int newbsiz;
  127. X
  128. X        newbsiz = bsiz * 8;
  129. X        while (newbsiz < inbufct)
  130. X            newbsiz *= 2;
  131. X        bptr = len+(tokstr = hrealloc(tokstr,bsiz,newbsiz));
  132. X        bsiz = newbsiz;
  133. X        }
  134. X}
  135. X
  136. Xstatic void unadd()
  137. X{
  138. X    bptr--; len--;
  139. X}
  140. X
  141. Xint gettok() /**/
  142. X{
  143. Xint bct = 0,pct = 0,brct = 0;
  144. Xint c,d,intpos = 1;
  145. Xint peekfd = -1,peek,ninbracks;
  146. X
  147. Xbeginning:
  148. X    hlastw = NULL;
  149. X    tokstr = NULL;
  150. X    parbegin = -1;
  151. X    while (iblank(c = hgetc()) && !lexstop);
  152. X    isfirstln = 0;
  153. X    wordbeg = inbufct;
  154. X    hwbegin();
  155. X    hwaddc(c);
  156. X    if (dbparens)    /* handle ((...)) */
  157. X        {
  158. X        pct = 2;
  159. X        peek = STRING;
  160. X        len = dbparens = 0;
  161. X        bptr = tokstr = ncalloc(bsiz = 256);
  162. X        for (;;)
  163. X            {
  164. X            if (c == '(')
  165. X                pct++;
  166. X            else if (c == ')')
  167. X                pct--;
  168. X            else if (c == '\n')
  169. X                {
  170. X                zerr("parse error: )) expected",NULL,0);
  171. X                peek = LEXERR;
  172. X                return peek;
  173. X                }
  174. X            else if (c == '$')
  175. X                c = Qstring;
  176. X            if (pct >= 2)
  177. X                add(c);
  178. X            if (pct)
  179. X                c = hgetc();
  180. X            else
  181. X                break;
  182. X            }
  183. X        *bptr = '\0';
  184. X        return peek;
  185. X        }
  186. X    if (idigit(c))    /* handle 1< foo */
  187. X        {
  188. X        d = hgetc();
  189. X        hungetc(d);
  190. X        lexstop = 0;
  191. X        if (d == '>' || d == '<')
  192. X            {
  193. X            peekfd = c-'0';
  194. X            c = hgetc();
  195. X            }
  196. X        }
  197. X
  198. X    /* chars in initial position in word */
  199. X
  200. X    if (c == hashchar &&
  201. X            (isset(INTERACTIVECOMMENTS) ||
  202. X            (!zleparse && (!interact || unset(SHINSTDIN) || strin))))
  203. X        {
  204. X        /* changed hgetch to hgetc so comments appear in history */
  205. X        stophist = 1;
  206. X        while ((c = hgetc()) != '\n' && !lexstop);
  207. X        if (c == '\n') {
  208. X            hwaddc('\n');
  209. X            peek = NEWLIN;
  210. X        } else {
  211. X            peek = (errflag) ? LEXERR : ENDINPUT;
  212. X            errflag = 1;
  213. X        }
  214. X        return peek;
  215. X        }
  216. X    if (lexstop)
  217. X        return (errflag) ? LEXERR : ENDINPUT;
  218. X    switch (lexact1[(unsigned char) c])
  219. X        {
  220. X        case LX1_BKSLASH:
  221. X            d = hgetc();
  222. X            if (d == '\n')
  223. X                goto beginning;
  224. X            hungetc(d);
  225. X            break;
  226. X        case LX1_NEWLIN: return NEWLIN;
  227. X        case LX1_SEMI:
  228. X            d = hgetc();
  229. X            if (d != ';')
  230. X                {
  231. X                hungetc(d);
  232. X                return SEMI;
  233. X                }
  234. X            return DSEMI;
  235. X        case LX1_BANG:
  236. X            d = hgetc();
  237. X            hungetc(d);
  238. X            if (!inblank(d))
  239. X                break;
  240. X            if (incmdpos || incond)
  241. X                return BANG;
  242. X            break;
  243. X        case LX1_AMPER:
  244. X            d = hgetc();
  245. X            if (d != '&')
  246. X                {
  247. X                hungetc(d);
  248. X                return AMPER;
  249. X                }
  250. X            return DAMPER;
  251. X        case LX1_BAR:
  252. X            d = hgetc();
  253. X            if (d == '|')
  254. X                return DBAR;
  255. X            else if (d == '&')
  256. X                return BARAMP;
  257. X            hungetc(d);
  258. X            return BAR;
  259. X        case LX1_INPAR:
  260. X            d = hgetc();
  261. X            if (d == '(' && incmdpos)
  262. X                {
  263. X                tokstr = strdup("let");
  264. X                dbparens = 1;
  265. X                return STRING;
  266. X                }
  267. X            else if (d == ')')
  268. X                return INOUTPAR;
  269. X            hungetc(d);
  270. X            if (!(incond || incmdpos))
  271. X                break;
  272. X            return INPAR;
  273. X        case LX1_OUTPAR: return OUTPAR;
  274. X        case LX1_INBRACE: if (!incmdpos) break; return INBRACE;
  275. X        case LX1_OUTBRACE: return OUTBRACE;
  276. X        case LX1_INBRACK:
  277. X            if (!incmdpos)
  278. X                break;
  279. X            d = hgetc();
  280. X            if (d == '[')
  281. X                return DINBRACK;
  282. X            hungetc(d);
  283. X            break;
  284. X        case LX1_OUTBRACK:
  285. X            if (!incond)
  286. X                break;
  287. X            d = hgetc();
  288. X            if (d == ']')
  289. X                return DOUTBRACK;
  290. X            hungetc(d);
  291. X            break;
  292. X        case LX1_INANG:
  293. X            d = hgetc();
  294. X            if ((!incmdpos && d == '(') || incasepat) {
  295. X                hungetc(d);
  296. X                break;
  297. X            } else if (d == '<') {
  298. X                int e = hgetc();
  299. X
  300. X                if (e == '(') {
  301. X                    hungetc(e);
  302. X                    hungetc(d);
  303. X                    peek = INANG;
  304. X                } else if (e == '<')
  305. X                    peek = TRINANG;
  306. X                else if (e == '-')
  307. X                    peek = DINANGDASH;
  308. X                else {
  309. X                    hungetc(e);
  310. X                    peek = DINANG;
  311. X                }
  312. X            } else if (d == '&')
  313. X                peek = INANGAMP;
  314. X            else {
  315. X                peek = INANG;
  316. X                hungetc(d);
  317. X            }
  318. X            tokfd = peekfd;
  319. X            return peek;
  320. X        case LX1_OUTANG:
  321. X            d = hgetc();
  322. X            if (d == '(')
  323. X                {
  324. X                hungetc(d);
  325. X                break;
  326. X                }
  327. X            else if (d == '&')
  328. X                {
  329. X                d = hgetc();
  330. X                if (d == '!')
  331. X                    peek = OUTANGAMPBANG;
  332. X                else
  333. X                    {
  334. X                    hungetc(d);
  335. X                    peek = OUTANGAMP;
  336. X                    }
  337. X                }
  338. X            else if (d == '!')
  339. X                peek = OUTANGBANG;
  340. X            else if (d == '>')
  341. X                {
  342. X                d = hgetc();
  343. X                if (d == '&')
  344. X                    {
  345. X                    d = hgetc();
  346. X                    if (d == '!')
  347. X                        peek = DOUTANGAMPBANG;
  348. X                    else
  349. X                        {
  350. X                        hungetc(d);
  351. X                        peek = DOUTANGAMP;
  352. X                        }
  353. X                    }
  354. X                else if (d == '!')
  355. X                    peek = DOUTANGBANG;
  356. X                else if (d == '(')
  357. X                    {
  358. X                    hungetc(d);
  359. X                    hungetc('>');
  360. X                    peek = OUTANG;
  361. X                    }
  362. X                else
  363. X                    {
  364. X                    hungetc(d);
  365. X                    peek = DOUTANG;
  366. X                    if (isset(NOCLOBBER)) hwaddc('!');
  367. X                    }
  368. X                }
  369. X            else
  370. X                {
  371. X                hungetc(d);
  372. X                peek = OUTANG;
  373. X                if (isset(NOCLOBBER)) hwaddc('!');
  374. X                }
  375. X            tokfd = peekfd;
  376. X            return peek;
  377. X        }
  378. X
  379. X    /* we've started a string, now get the rest of it, performing
  380. X        tokenization */
  381. X
  382. X    peek = STRING;
  383. X    len = 0;
  384. X    bptr = tokstr = ncalloc(bsiz = 256);
  385. X    for(;;)
  386. X        {
  387. X        int act;
  388. X        int d;
  389. X        
  390. X        if (inblank(c))
  391. X            act = LX2_BREAK;
  392. X        else
  393. X            {
  394. X            act = lexact2[(unsigned char) c];
  395. X            c = lextok2[(unsigned char) c];
  396. X            }
  397. X        switch (act)
  398. X            {
  399. X            case LX2_BREAK: goto brk;
  400. X            case LX2_OUTPAR:
  401. X                if (!pct)
  402. X                    goto brk;
  403. X                c = Outpar;
  404. X                pct--;
  405. X                break;
  406. X            case LX2_BAR:
  407. X                if (!pct && !incasepat)
  408. X                    goto brk;
  409. X                c = Bar;
  410. X                break;
  411. X            case LX2_STRING:
  412. X                d = hgetc();
  413. X                if (d == '[')
  414. X                    {
  415. X                    add(String);
  416. X                    add(Inbrack);
  417. X                    ninbracks = 1;
  418. X                    while (ninbracks && (c = hgetc()) && !lexstop) {
  419. X                        if (c == '[') ninbracks++;
  420. X                        else if (c == ']') ninbracks--;
  421. X                        if (ninbracks) add(c);
  422. X                    }
  423. X                    c = Outbrack;
  424. X                    }
  425. X                else if (d == '(')
  426. X                    {
  427. X                    add(String);
  428. X                    if (skipcomm()) { peek = LEXERR; goto brk; }
  429. X                    c = Outpar;
  430. X                    }
  431. X                else
  432. X                    hungetc(d);
  433. X                break;
  434. X            case LX2_INBRACK: brct++; break;
  435. X            case LX2_OUTBRACK:
  436. X                if (incond && !brct)
  437. X                    goto brk;
  438. X                brct--;
  439. X                c = Outbrack;
  440. X                break;
  441. X            case LX2_TILDE: /* if (intpos) */ c = Tilde; break;
  442. X            case LX2_INPAR:
  443. X                d = hgetc();
  444. X                hungetc(d);
  445. X                if (d == ')' || (incmdpos && peek != ENVSTRING))
  446. X                    goto brk;
  447. X                pct++;
  448. X                c = Inpar;
  449. X                break;
  450. X            case LX2_INBRACE: bct++; break;
  451. X            case LX2_OUTBRACE:
  452. X                if (!bct)
  453. X                    goto brk;
  454. X                bct--;
  455. X                c = Outbrace;
  456. X                break;
  457. X            case LX2_OUTANG:
  458. X                d = hgetc();
  459. X                if (d != '(')
  460. X                    {
  461. X                    hungetc(d);
  462. X                    goto brk;
  463. X                    }
  464. X                add(Outang);
  465. X                if (skipcomm()) { peek = LEXERR; goto brk; }
  466. X                c = Outpar;
  467. X                break;
  468. X            case LX2_INANG:
  469. X                d = hgetc();
  470. X                if (!(idigit(d) || d == '-' || d == '>' || d == '(' || d == ')'))
  471. X                    {
  472. X                    hungetc(d);
  473. X                    goto brk;
  474. X                    }
  475. X                c = Inang;
  476. X                if (d == '(')
  477. X                    {
  478. X                    add(c);
  479. X                    if (skipcomm()) { peek = LEXERR; goto brk; }
  480. X                    c = Outpar;
  481. X                    }
  482. X                else if (d == ')')
  483. X                    hungetc(d);
  484. X                else
  485. X                    {
  486. X                    add(c);
  487. X                    c = d;
  488. X                    while (c != '>' && !lexstop)
  489. X                        add(c),c = hgetc();
  490. X                    c = Outang;
  491. X                    }
  492. X                break;
  493. X            case LX2_EQUALS:
  494. X                if (intpos)
  495. X                    {
  496. X                    d = hgetc();
  497. X                    if (d != '(')
  498. X                        {
  499. X                        hungetc(d);
  500. X                        c = Equals;
  501. X                        }
  502. X                    else
  503. X                        {
  504. X                        add(Equals);
  505. X                        if (skipcomm()) { peek = LEXERR; goto brk; }
  506. X                        c = Outpar;
  507. X                        }
  508. X                    }
  509. X                else if (peek != ENVSTRING && incmdpos)
  510. X                    {
  511. X                    d = hgetc();
  512. X                    if (d == '(' && incmdpos)
  513. X                        {
  514. X                        *bptr = '\0';
  515. X                        return ENVARRAY;
  516. X                        }
  517. X                    hungetc(d);
  518. X                    peek = ENVSTRING;
  519. X                    intpos = 2;
  520. X                    }
  521. X                break;
  522. X            case LX2_BKSLASH:
  523. X                c = hgetc();
  524. X                if (c == '\n')
  525. X                    {
  526. X                    c = hgetc();
  527. X                    continue;
  528. X                    }
  529. X                add(c);
  530. X                c = hgetc();
  531. X                continue;
  532. X            case LX2_QUOTE:
  533. X                add(Nularg);
  534. X
  535. X                /* we add the Nularg to prevent this:
  536. X
  537. X                echo $PA'TH'
  538. X
  539. X                from printing the path. */
  540. X
  541. X                for (;;) {
  542. X                    while ((c = hgetc()) != '\'' && !lexstop) {
  543. X                        if (isset(CSHJUNKIEQUOTES) && c == '\n') {
  544. X                            if (bptr[-1] == '\\') unadd(); else break;
  545. X                        }
  546. X                        add(c);
  547. X                    }
  548. X                    if (c != '\'') {
  549. X                        zerr("unmatched \'",NULL,0);
  550. X                        peek = LEXERR;
  551. X                        goto brk;
  552. X                    }
  553. X                    d = hgetc();
  554. X                    if (d != '\'' || unset(RCQUOTES)) break;
  555. X                    add(c);
  556. X                }
  557. X                hungetc(d);
  558. X                c = Nularg;
  559. X                break;
  560. X            case LX2_DQUOTE:
  561. X                add(Nularg);
  562. X                while ((c = hgetc()) != '\"' && !lexstop)
  563. X                    if (c == '\\')
  564. X                        {
  565. X                        c = hgetc();
  566. X                        if (c != '\n')
  567. X                            {
  568. X                            if (c != '$' && c != '\\' && c != '\"' && c != '`')
  569. X                                add('\\');
  570. X                            add(c);
  571. X                            }
  572. X                        }
  573. X                    else {
  574. X                        if (isset(CSHJUNKIEQUOTES) && c == '\n') {
  575. X                            if (bptr[-1] == '\\') unadd(); else break;
  576. X                        }
  577. X                        if (c == '$') {
  578. X                            d = hgetc();
  579. X                            if (d == '(') {
  580. X                                add(Qstring);
  581. X                                if (skipcomm()) { peek = LEXERR; goto brk; }
  582. X                                c = Outpar;
  583. X                            } else if (d == '[') {
  584. X                                add(String);
  585. X                                add(Inbrack);
  586. X                                while ((c = hgetc()) != ']' && !lexstop)
  587. X                                    add(c);
  588. X                                c = Outbrack;
  589. X                            } else {
  590. X                                c = Qstring;
  591. X                                hungetc(d);
  592. X                            }
  593. X                        } else if (c == '`')
  594. X                            c = Qtick;
  595. X                        add(c);
  596. X                    }
  597. X                if (c != '\"') {
  598. X                    zerr("unmatched \"",NULL,0);
  599. X                    peek = LEXERR;
  600. X                    goto brk;
  601. X                }
  602. X                c = Nularg;
  603. X                break;
  604. X            case LX2_BQUOTE:
  605. X                add(Tick);
  606. X                parbegin = inbufct;
  607. X                while ((c = hgetc()) != '`' && !lexstop)
  608. X                    if (c == '\\')
  609. X                        {
  610. X                        c = hgetc();
  611. X                        if (c != '\n')
  612. X                            {
  613. X                            if (c != '`' && c != '\\' && c != '$')
  614. X                                add('\\');
  615. X                            add(c);
  616. X                            }
  617. X                        }
  618. X                    else {
  619. X                        if (isset(CSHJUNKIEQUOTES) && c == '\n') {
  620. X                            if (bptr[-1] == '\\') unadd(); else break;
  621. X                        }
  622. X                        add(c);
  623. X                    }
  624. X                if (c != '`') {
  625. X                    if (!zleparse) zerr("unmatched `",NULL,0);
  626. X                    peek = LEXERR;
  627. X                    goto brk;
  628. X                }
  629. X                c = Tick;
  630. X                parbegin = -1;
  631. X                break;
  632. X            }
  633. X        add(c);
  634. X        c = hgetc();
  635. X        if (intpos)
  636. X            intpos--;
  637. X        if (lexstop)
  638. X            break;
  639. X        }
  640. Xbrk:
  641. X    hungetc(c);
  642. X    *bptr = '\0';
  643. X    return peek;
  644. X}
  645. X
  646. X/* expand aliases, perhaps */
  647. X
  648. Xint exalias() /**/
  649. X{
  650. Xstruct alias *an;
  651. Xchar *s,*t;
  652. X
  653. X    s = yytext = hwadd();
  654. X    for (t = s; *t && *t != HISTSPACE; t++);
  655. X    if (!*t)
  656. X        t = NULL;
  657. X    else
  658. X        *t = '\0';
  659. X    if (interact && isset(SHINSTDIN) && !strin && !incasepat && tok == STRING &&
  660. X        (isset(CORRECTALL) || (isset(CORRECT) && incmdpos)) && !nocorrect)
  661. X            spckword(&tokstr,&s,&t,!incmdpos,1);
  662. X    if (zleparse && !alstackind) {
  663. X        int zp = zleparse;
  664. X        gotword(s);
  665. X        if (zp && !zleparse) {
  666. X            if (t) *t = HISTSPACE;
  667. X            return 0;
  668. X        }
  669. X    }
  670. X    an = gethnode(s,aliastab);
  671. X    if (t) *t = HISTSPACE;
  672. X    if (alstackind != MAXAL && an && !an->inuse)
  673. X        if (!(an->cmd && !incmdpos && alstat != ALSTAT_MORE)) {
  674. X            if (an->cmd < 0) {
  675. X                tok = DO-an->cmd-1;
  676. X                return 0;
  677. X            } else {
  678. X                an->inuse = 1;
  679. X                hungets(ALPOPS);
  680. X                hungets((alstack[alstackind++] = an)->text);
  681. X                alstat = 0;
  682. X                /* remove from history if it begins with space */
  683. X                if (isset(HISTIGNORESPACE) && an->text[0] == ' ') remhist();
  684. X                lexstop = 0;
  685. X                return 1;
  686. X            }
  687. X        }
  688. X    return 0;
  689. X}
  690. X
  691. X/* skip (...) */
  692. X
  693. Xint skipcomm() /**/
  694. X{
  695. Xint pct = 1,c;
  696. X
  697. X    parbegin = inbufct;
  698. X    c = Inpar;
  699. X    do
  700. X        {
  701. X        add(c);
  702. X        c = hgetc();
  703. X        if (itok(c) || lexstop)
  704. X            break;
  705. X        else if (c == '(') pct++;
  706. X        else if (c == ')') pct--;
  707. X        else if (c == '\\')
  708. X            {
  709. X            add(c);
  710. X            c = hgetc();
  711. X            }
  712. X        else if (c == '\'')
  713. X            {
  714. X            add(c);
  715. X            while ((c = hgetc()) != '\'' && !lexstop)
  716. X                add(c);
  717. X            }
  718. X        else if (c == '\"')
  719. X            {
  720. X            add(c);
  721. X            while ((c = hgetc()) != '\"' && !lexstop)
  722. X                if (c == '\\')
  723. X                    {
  724. X                    add(c);
  725. X                    add(hgetc());
  726. X                    }
  727. X                else add(c);
  728. X            }
  729. X        else if (c == '`')
  730. X            {
  731. X            add(c);
  732. X            while ((c = hgetc()) != '`' && !lexstop)
  733. X                if (c == '\\') add(c), add(hgetc());
  734. X                else add(c);
  735. X            }
  736. X        }
  737. X    while(pct);
  738. X    if (!lexstop) parbegin = -1;
  739. X    return lexstop;
  740. X}
  741. X
  742. SHAR_EOF
  743. echo 'File zsh2.2/src/lex.c is complete' &&
  744. chmod 0644 zsh2.2/src/lex.c ||
  745. echo 'restore of zsh2.2/src/lex.c failed'
  746. Wc_c="`wc -c < 'zsh2.2/src/lex.c'`"
  747. test 15554 -eq "$Wc_c" ||
  748.     echo 'zsh2.2/src/lex.c: original size 15554, current size' "$Wc_c"
  749. rm -f _shar_wnt_.tmp
  750. fi
  751. # ============= zsh2.2/src/loop.c ==============
  752. if test -f 'zsh2.2/src/loop.c' -a X"$1" != X"-c"; then
  753.     echo 'x - skipping zsh2.2/src/loop.c (File already exists)'
  754.     rm -f _shar_wnt_.tmp
  755. else
  756. > _shar_wnt_.tmp
  757. echo 'x - extracting zsh2.2/src/loop.c (Text)'
  758. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.2/src/loop.c' &&
  759. X/*
  760. X *
  761. X * loop.c - loop execution
  762. X *
  763. X * This file is part of zsh, the Z shell.
  764. X *
  765. X * This software is Copyright 1992 by Paul Falstad
  766. X *
  767. X * Permission is hereby granted to copy, reproduce, redistribute or otherwise
  768. X * use this software as long as: there is no monetary profit gained
  769. X * specifically from the use or reproduction of this software, it is not
  770. X * sold, rented, traded or otherwise marketed, and this copyright notice is
  771. X * included prominently in any copy made. 
  772. X *
  773. X * The author make no claims as to the fitness or correctness of this software
  774. X * for any use whatsoever, and it is provided as is. Any use of this software
  775. X * is at the user's own risk. 
  776. X *
  777. X */
  778. X
  779. X#include "zsh.h"
  780. X
  781. Xint execfor(cmd) /**/
  782. XCmd cmd;
  783. X{
  784. XList list;
  785. Xstruct forcmd *node;
  786. Xchar *str;
  787. XLklist args;
  788. Xint cj = thisjob;
  789. X
  790. X    loops++;
  791. X    exiting = 0;
  792. X    node = cmd->u.forcmd;
  793. X    args = cmd->args;
  794. X    if (!node->inflag)
  795. X        {
  796. X        char **x;
  797. X
  798. X        args = newlist();
  799. X        for (x = pparams; *x; x++)
  800. X            addnode(args,ztrdup(*x));
  801. X        }
  802. X    pushheap();
  803. X    while (str = ugetnode(args))
  804. X        {
  805. X        setsparam(node->name,ztrdup(str));
  806. X        list = dupstruct(node->list);
  807. X        execlist(list);
  808. X        if (breaks)
  809. X            {
  810. X            breaks--;
  811. X            if (breaks || !contflag)
  812. X                break;
  813. X            contflag = 0;
  814. X            }
  815. X        if (errflag)
  816. X            {
  817. X            lastval = 1;
  818. X            break;
  819. X            }
  820. X        freeheap();
  821. X        }
  822. X    popheap();
  823. X    thisjob = cj;
  824. X    loops--;
  825. X    return lastval;
  826. X}
  827. X
  828. Xint execselect(cmd) /**/
  829. XCmd cmd;
  830. X{
  831. XList list;
  832. Xstruct forcmd *node;
  833. Xchar *str,*s;
  834. XLklist args;
  835. XLknode n;
  836. Xint cj = thisjob,t0;
  837. XFILE *inp;
  838. X
  839. X    node = cmd->u.forcmd;
  840. X    args = cmd->args;
  841. X    if (!node->inflag) {
  842. X        char **x;
  843. X
  844. X        args = newlist();
  845. X        for (x = pparams; *x; x++)
  846. X            addnode(args,ztrdup(*x));
  847. X    }
  848. X    if (!full(args))
  849. X        return 1;
  850. X    loops++;
  851. X    exiting = 0;
  852. X    pushheap();
  853. X    inp = fdopen(dup((SHTTY==-1)?0:SHTTY),"r");
  854. X    for (;;)
  855. X        {
  856. X        do
  857. X            {
  858. X            int pl;
  859. X            selectlist(args);
  860. X            str = putprompt(prompt3,&pl);
  861. X            if (full(bufstack)) str = (char *) getnode(bufstack);
  862. X            else if (interact && SHTTY != -1 && isset(USEZLE)) {
  863. X                str = (char *)zleread(str,NULL,pl);
  864. X            } else {
  865. X                fprintf(stderr,"%s",str);
  866. X                fflush(stderr);
  867. X                str = fgets(zalloc(256),256,inp);
  868. X            }
  869. X            if (!str || errflag)
  870. X                {
  871. X                fprintf(stderr,"\n");
  872. X                fflush(stderr);
  873. X                goto done;
  874. X                }
  875. X            if (s = strchr(str,'\n'))
  876. X                *s = '\0';
  877. X            }
  878. X        while (!*str);
  879. X        setsparam("REPLY",ztrdup(str));
  880. X        t0 = atoi(str);
  881. X        if (!t0)
  882. X            str = "";
  883. X        else
  884. X            {
  885. X            for (t0--,n = firstnode(args); n && t0; incnode(n),t0--);
  886. X            if (n)
  887. X                str = getdata(n);
  888. X            else
  889. X                str = "";
  890. X            }
  891. X        setsparam(node->name,ztrdup(str));
  892. X        list = dupstruct(node->list);
  893. X        execlist(list);
  894. X        freeheap();
  895. X        if (breaks)
  896. X            {
  897. X            breaks--;
  898. X            if (breaks || !contflag)
  899. X                break;
  900. X            contflag = 0;
  901. X            }
  902. X        if (errflag)
  903. X            break;
  904. X        }
  905. Xdone:
  906. X    popheap();
  907. X    fclose(inp);
  908. X    thisjob = cj;
  909. X    loops--;
  910. X    return lastval;
  911. X}
  912. Xint execwhile(cmd) /**/
  913. XCmd cmd;
  914. X{
  915. XList list;
  916. Xstruct whilecmd *node;
  917. Xint cj = thisjob; 
  918. X
  919. X    node = cmd->u.whilecmd;
  920. X    exiting = 0;
  921. X    pushheap();
  922. X    loops++;
  923. X    for(;;)
  924. X        {
  925. X        list = dupstruct(node->cont);
  926. X        execlist(list);
  927. X        if (!((lastval == 0) ^ node->cond))
  928. X            break;
  929. X        list = dupstruct(node->loop);
  930. X        execlist(list);
  931. X        if (breaks)
  932. X            {
  933. X            breaks--;
  934. X            if (breaks || !contflag)
  935. X                break;
  936. X            contflag = 0;
  937. X            }
  938. X        freeheap();
  939. X        if (errflag)
  940. X            {
  941. X            lastval = 1;
  942. X            break;
  943. X            }
  944. X        }
  945. X    popheap();
  946. X    thisjob = cj;
  947. X    loops--;
  948. X    return lastval;
  949. X}
  950. Xint execrepeat(cmd) /**/
  951. XCmd cmd;
  952. X{
  953. XList list;
  954. Xint cj = thisjob,count;
  955. X
  956. X    exiting = 0;
  957. X    if (!full(cmd->args) || nextnode(firstnode(cmd->args)))
  958. X        {
  959. X        zerr("bad argument for repeat",NULL,0);
  960. X        return 1;
  961. X        }
  962. X    count = atoi(peekfirst(cmd->args));
  963. X    pushheap();
  964. X    loops++;
  965. X    while (count--)
  966. X        {
  967. X        list = dupstruct(cmd->u.list);
  968. X        execlist(list);
  969. X        freeheap();
  970. X        if (breaks)
  971. X            {
  972. X            breaks--;
  973. X            if (breaks || !contflag)
  974. X                break;
  975. X            contflag = 0;
  976. X            }
  977. X        if (lastval)
  978. X            break;
  979. X        if (errflag)
  980. X            {
  981. X            lastval = 1;
  982. X            break;
  983. X            }
  984. X        }
  985. X    popheap();
  986. X    thisjob = cj;
  987. X    loops--;
  988. X    return lastval;
  989. X}
  990. Xint execif(cmd) /**/
  991. XCmd cmd;
  992. X{
  993. Xstruct ifcmd *node;
  994. Xint cj = thisjob;
  995. X
  996. X    node = cmd->u.ifcmd;
  997. X    exiting = 0;
  998. X    while (node)
  999. X        {
  1000. X        if (node->ifl)
  1001. X            {
  1002. X            execlist(node->ifl);
  1003. X            if (lastval)
  1004. X                {
  1005. X                node = node->next;
  1006. X                continue;
  1007. X                }
  1008. X            }
  1009. X        execlist(node->thenl);
  1010. X        break;
  1011. X        }
  1012. X    thisjob = cj;
  1013. X    return lastval;
  1014. X}
  1015. Xint execcase(cmd) /**/
  1016. XCmd cmd;
  1017. X{
  1018. Xstruct casecmd *node;
  1019. Xchar *word;
  1020. XLklist args;
  1021. Xint cj = thisjob;
  1022. X
  1023. X    node = cmd->u.casecmd;
  1024. X    args = cmd->args;
  1025. X    exiting = 0;
  1026. X    if (firstnode(args) && nextnode(firstnode(args)))
  1027. X        {
  1028. X        zerr("too many arguments to case",NULL,0);
  1029. X        errflag = 1;
  1030. X        return 1;
  1031. X        }
  1032. X    if (!full(args))
  1033. X        word = strdup("");
  1034. X    else
  1035. X        word = peekfirst(args);
  1036. X    while (node)
  1037. X        {
  1038. X        singsub(&(node->pat));
  1039. X        if (matchpat(word,node->pat))
  1040. X            break;
  1041. X        else
  1042. X            node = node->next;
  1043. X        }
  1044. X    if (node && node->list)
  1045. X        execlist(node->list);
  1046. X    thisjob = cj;
  1047. X    return lastval;
  1048. X}
  1049. SHAR_EOF
  1050. chmod 0644 zsh2.2/src/loop.c ||
  1051. echo 'restore of zsh2.2/src/loop.c failed'
  1052. Wc_c="`wc -c < 'zsh2.2/src/loop.c'`"
  1053. test 4752 -eq "$Wc_c" ||
  1054.     echo 'zsh2.2/src/loop.c: original size 4752, current size' "$Wc_c"
  1055. rm -f _shar_wnt_.tmp
  1056. fi
  1057. # ============= zsh2.2/src/math.c ==============
  1058. if test -f 'zsh2.2/src/math.c' -a X"$1" != X"-c"; then
  1059.     echo 'x - skipping zsh2.2/src/math.c (File already exists)'
  1060.     rm -f _shar_wnt_.tmp
  1061. else
  1062. > _shar_wnt_.tmp
  1063. echo 'x - extracting zsh2.2/src/math.c (Text)'
  1064. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.2/src/math.c' &&
  1065. X/*
  1066. X *
  1067. X * math.c - mathematical expression evaluation
  1068. X *
  1069. X * This file is part of zsh, the Z shell.
  1070. X *
  1071. X * This software is Copyright 1992 by Paul Falstad
  1072. X *
  1073. X * Permission is hereby granted to copy, reproduce, redistribute or otherwise
  1074. X * use this software as long as: there is no monetary profit gained
  1075. X * specifically from the use or reproduction of this software, it is not
  1076. X * sold, rented, traded or otherwise marketed, and this copyright notice is
  1077. X * included prominently in any copy made. 
  1078. X *
  1079. X * The author make no claims as to the fitness or correctness of this software
  1080. X * for any use whatsoever, and it is provided as is. Any use of this software
  1081. X * is at the user's own risk. 
  1082. X *
  1083. X */
  1084. X
  1085. X#include "zsh.h"
  1086. X
  1087. Xstatic char *ptr;
  1088. X
  1089. Xtypedef int LV;
  1090. X
  1091. Xstatic long yyval;
  1092. Xstatic LV yylval;
  1093. X
  1094. X/* nonzero means we are not evaluating, just parsing */
  1095. X
  1096. Xstatic int noeval = 0;
  1097. X
  1098. X/* != 0 means recognize unary plus, minus, etc. */
  1099. X
  1100. Xstatic int unary = 1;
  1101. X
  1102. Xvoid mathparse DCLPROTO((int));
  1103. X
  1104. X/* LR = left-to-right associativity
  1105. X    RL = right-to-left associativity
  1106. X    BOO = short-circuiting boolean */
  1107. X
  1108. X#define LR 0
  1109. X#define RL 1
  1110. X#define BOOL 2
  1111. X
  1112. X#define M_INPAR 0
  1113. X#define M_OUTPAR 1
  1114. X#define NOT 2
  1115. X#define COMP 3
  1116. X#define POSTPLUS 4
  1117. X#define POSTMINUS 5
  1118. X#define UPLUS 6
  1119. X#define UMINUS 7
  1120. X#define AND 8
  1121. X#define XOR 9
  1122. X#define OR 10
  1123. X#define MUL 11
  1124. X#define DIV 12
  1125. X#define MOD 13
  1126. X#define PLUS 14
  1127. X#define MINUS 15
  1128. X#define SHLEFT 16
  1129. X#define SHRIGHT 17
  1130. X#define LES 18
  1131. X#define LEQ 19
  1132. X#define GRE 20
  1133. X#define GEQ 21
  1134. X#define DEQ 22
  1135. X#define NEQ 23
  1136. X#define DAND 24
  1137. X#define DOR 25
  1138. X#define DXOR 26
  1139. X#define QUEST 27
  1140. X#define COLON 28
  1141. X#define EQ 29
  1142. X#define PLUSEQ 30
  1143. X#define MINUSEQ 31
  1144. X#define MULEQ 32
  1145. X#define DIVEQ 33
  1146. X#define MODEQ 34
  1147. X#define ANDEQ 35
  1148. X#define XOREQ 36
  1149. X#define OREQ 37
  1150. X#define SHLEFTEQ 38
  1151. X#define SHRIGHTEQ 39
  1152. X#define DANDEQ 40
  1153. X#define DOREQ 41
  1154. X#define DXOREQ 42
  1155. X#define COMMA 43
  1156. X#define EOI 44
  1157. X#define PREPLUS 45
  1158. X#define PREMINUS 46
  1159. X#define NUM 47
  1160. X#define ID 48
  1161. X#define TOKCOUNT 49
  1162. X
  1163. X/* precedences */
  1164. X
  1165. Xstatic int prec[TOKCOUNT] = {
  1166. X    1,137,2,2,2,
  1167. X    2,2,2,4,5,
  1168. X    6,7,7,7,8,
  1169. X    8,3,3,9,9,
  1170. X    9,9,10,10,11,
  1171. X    12,12,13,13,14,
  1172. X    14,14,14,14,14,
  1173. X    14,14,14,14,14,
  1174. X    14,14,14,15,200,
  1175. X    2,2,0,0,
  1176. X};
  1177. X
  1178. X#define TOPPREC 15
  1179. X#define ARGPREC (15-1)
  1180. X
  1181. Xstatic int type[TOKCOUNT] = {
  1182. X    LR,LR,RL,RL,RL,
  1183. X    RL,RL,RL,LR,LR,
  1184. X    LR,LR,LR,LR,LR,
  1185. X    LR,LR,LR,LR,LR,
  1186. X    LR,LR,LR,LR,BOOL,
  1187. X    BOOL,LR,RL,RL,RL,
  1188. X    RL,RL,RL,RL,RL,
  1189. X    RL,RL,RL,RL,RL,
  1190. X    BOOL,BOOL,RL,RL,RL,
  1191. X    RL,RL,LR,LR,
  1192. X};
  1193. X
  1194. X#define LVCOUNT 32
  1195. X
  1196. X/* list of lvalues (variables) */
  1197. X
  1198. Xstatic int lvc;
  1199. Xstatic char *lvals[LVCOUNT];
  1200. X
  1201. Xint zzlex() /**/
  1202. X{
  1203. X    for(;;)
  1204. X        switch (*ptr++)
  1205. X            {
  1206. X            case '+':
  1207. X                if (*ptr == '+' && (unary || !ialnum(*ptr)))
  1208. X                    {
  1209. X                    ptr++;
  1210. X                    return (unary) ? PREPLUS : POSTPLUS;
  1211. X                    }
  1212. X                if (*ptr == '=') { unary = 1; ptr++; return PLUSEQ; }
  1213. X                return (unary) ? UPLUS : PLUS;
  1214. X            case '-':
  1215. X                if (*ptr == '-' && (unary || !ialnum(*ptr)))
  1216. X                    {
  1217. X                    ptr++;
  1218. X                    return (unary) ? PREMINUS : POSTMINUS;
  1219. X                    }
  1220. X                if (*ptr == '=') { unary = 1; ptr++; return MINUSEQ; }
  1221. X                return (unary) ? UMINUS : MINUS;
  1222. X            case '(': unary = 1; return M_INPAR;
  1223. X            case ')': return M_OUTPAR;
  1224. X            case '!': if (*ptr == '=')
  1225. X                        { unary = 1; ptr++; return NEQ; }
  1226. X                        return NOT;
  1227. X            case '~': return COMP;
  1228. X            case '&': unary = 1;
  1229. X                if (*ptr == '&') { if (*++ptr == '=')
  1230. X                { ptr++; return DANDEQ; } return DAND; }
  1231. X                else if (*ptr == '=') { ptr++; return ANDEQ; } return AND;
  1232. X            case '|': unary = 1;
  1233. X                if (*ptr == '|') { if (*++ptr == '=')
  1234. X                { ptr++; return DOREQ; } return DOR; }
  1235. X                else if (*ptr == '=') { ptr++; return OREQ; } return OR;
  1236. X            case '^': unary = 1;
  1237. X                if (*ptr == '^') { if (*++ptr == '=')
  1238. X                { ptr++; return DXOREQ; } return DXOR; }
  1239. X                else if (*ptr == '=') { ptr++; return XOREQ; } return XOR;
  1240. X            case '*': unary = 1;
  1241. X                if (*ptr == '=') { ptr++; return MULEQ; } return MUL;
  1242. X            case '/': unary = 1;
  1243. X                if (*ptr == '=') { ptr++; return DIVEQ; } return DIV;
  1244. X            case '%': unary = 1;
  1245. X                if (*ptr == '=') { ptr++; return MODEQ; } return MOD;
  1246. X            case '<': unary = 1; if (*ptr == '<')
  1247. X                { if (*++ptr == '=') { ptr++; return SHLEFTEQ; } return SHLEFT; }
  1248. X                else if (*ptr == '=') { ptr++; return LEQ; } return LES;
  1249. X            case '>': unary = 1; if (*ptr == '>')
  1250. X                { if (*++ptr == '=') { ptr++; return SHRIGHTEQ; } return SHRIGHT; }
  1251. X                else if (*ptr == '=') { ptr++; return GEQ; } return GRE;
  1252. X            case '=': unary = 1; if (*ptr == '=') { ptr++; return DEQ; }
  1253. X                return EQ;
  1254. X            case '?': unary = 1; return QUEST;
  1255. X            case ':': unary = 1; return COLON;
  1256. X            case ',': unary = 1; return COMMA;
  1257. X            case '\0': unary = 1; ptr--; return EOI;
  1258. X            case '[': unary = 0;
  1259. X                { int base = zstrtol(ptr,&ptr,10);
  1260. X                    if (*ptr == ']') ptr++;
  1261. X                    yyval = zstrtol(ptr,&ptr,lastbase = base);
  1262. X                    return NUM; }
  1263. X            case ' ': case '\t':
  1264. X                break;
  1265. X            default:
  1266. X                if (idigit(*--ptr))
  1267. X                    { unary = 0; yyval = zstrtol(ptr,&ptr,10); return NUM; }
  1268. X                if (iident(*ptr) || *ptr == '$')
  1269. X                    {
  1270. X                    char *p,q;
  1271. X
  1272. X                    if (*ptr == '$')
  1273. X                        ptr++;
  1274. X                    p = ptr;
  1275. X                    if (lvc == LVCOUNT)
  1276. X                        {
  1277. X                        zerr("too many identifiers (complain to author)",NULL,0);
  1278. X                        return EOI;
  1279. X                        }
  1280. X                    unary = 0;
  1281. X                    while(iident(*++ptr));
  1282. X                    q = *ptr;
  1283. X                    *ptr = '\0';
  1284. X                    lvals[yylval = lvc++] = ztrdup(p);
  1285. X                    *ptr = q;
  1286. X                    return ID;
  1287. X                    }
  1288. X                return EOI;
  1289. X            }
  1290. X}
  1291. X
  1292. X/* the value stack */
  1293. X
  1294. X#define STACKSZ 100
  1295. Xint mtok;            /* last token */
  1296. Xint sp = -1;    /* stack pointer */
  1297. Xstruct mathvalue {
  1298. X    LV lval;
  1299. X    long val;
  1300. X    } stack[STACKSZ];
  1301. X
  1302. Xvoid push(val,lval)
  1303. Xlong val;LV lval;
  1304. X{
  1305. X    if (sp == STACKSZ-1)
  1306. X        zerr("stack overflow",NULL,0);
  1307. X    else
  1308. X        sp++;
  1309. X    stack[sp].val = val;
  1310. X    stack[sp].lval = lval;
  1311. X}
  1312. X
  1313. Xlong getvar(s)
  1314. XLV s;
  1315. X{
  1316. Xlong t;
  1317. X
  1318. X    if (!(t = getiparam(lvals[s])))
  1319. X        return 0;
  1320. X    return t;
  1321. X}
  1322. X
  1323. Xlong setvar(s,v)
  1324. XLV s;long v;
  1325. X{
  1326. X    if (s == -1 || s >= lvc)
  1327. X        {
  1328. X        zerr("lvalue required",NULL,0);
  1329. X        return 0;
  1330. X        }
  1331. X    if (noeval)
  1332. X        return v;
  1333. X    setiparam(lvals[s],v);
  1334. X    return v;
  1335. X}
  1336. X
  1337. Xint notzero(a) /**/
  1338. Xint a;
  1339. X{
  1340. X    if (a == 0)
  1341. X        {
  1342. X        zerr("division by zero",NULL,0);
  1343. X        return 0;
  1344. X        }
  1345. X    return 1;
  1346. X}
  1347. X
  1348. X#define pop2() { b = stack[sp--].val; a = stack[sp--].val; }
  1349. X#define pop3() {c=stack[sp--].val;b=stack[sp--].val;a=stack[sp--].val;}
  1350. X#define nolval() {stack[sp].lval= -1;}
  1351. X#define pushv(X) { push(X,-1); }
  1352. X#define pop2lv() { pop2() lv = stack[sp+1].lval; }
  1353. X#define set(X) { push(setvar(lv,X),lv); }
  1354. X
  1355. Xvoid op(what) /**/
  1356. Xint what;
  1357. X{
  1358. Xlong a,b,c;
  1359. XLV lv;
  1360. X
  1361. X    if (sp < 0)
  1362. X        {
  1363. X        zerr("bad math expression: stack empty",NULL,0);
  1364. X        return;
  1365. X        }
  1366. X    switch(what) {
  1367. X        case NOT: stack[sp].val = !stack[sp].val; nolval(); break;
  1368. X        case COMP: stack[sp].val = ~stack[sp].val; nolval(); break;
  1369. X        case POSTPLUS: ( void ) setvar(stack[sp].lval,stack[sp].val+1); break;
  1370. X        case POSTMINUS: ( void ) setvar(stack[sp].lval,stack[sp].val-1); break;
  1371. X        case UPLUS: nolval(); break;
  1372. X        case UMINUS: stack[sp].val = -stack[sp].val; nolval(); break;
  1373. X        case AND: pop2(); pushv(a&b); break;
  1374. X        case XOR: pop2(); pushv(a^b); break;
  1375. X        case OR: pop2(); pushv(a|b); break;
  1376. X        case MUL: pop2(); pushv(a*b); break;
  1377. X        case DIV: pop2(); if (notzero(b)) pushv(a/b); break;
  1378. X        case MOD: pop2(); if (notzero(b)) pushv(a%b); break;
  1379. X        case PLUS: pop2(); pushv(a+b); break;
  1380. X        case MINUS: pop2(); pushv(a-b); break;
  1381. X        case SHLEFT: pop2(); pushv(a<<b); break;
  1382. X        case SHRIGHT: pop2(); pushv(a>>b); break;
  1383. X        case LES: pop2(); pushv(a<b); break;
  1384. X        case LEQ: pop2(); pushv(a<=b); break;
  1385. X        case GRE: pop2(); pushv(a>b); break;
  1386. X        case GEQ: pop2(); pushv(a>=b); break;
  1387. X        case DEQ: pop2(); pushv(a==b); break;
  1388. X        case NEQ: pop2(); pushv(a!=b); break;
  1389. X        case DAND: pop2(); pushv(a&&b); break;
  1390. X        case DOR: pop2(); pushv(a||b); break;
  1391. X        case DXOR: pop2(); pushv(a&&!b||!a&&b); break;
  1392. X        case QUEST: pop3(); pushv((a)?b:c); break;
  1393. X        case COLON: break;
  1394. X        case EQ: pop2lv(); set(b); break;
  1395. X        case PLUSEQ: pop2lv(); set(a+b); break;
  1396. X        case MINUSEQ: pop2lv(); set(a-b); break;
  1397. X        case MULEQ: pop2lv(); set(a*b); break;
  1398. X        case DIVEQ: pop2lv(); if (notzero(b)) set(a/b); break;
  1399. X        case MODEQ: pop2lv(); if (notzero(b)) set(a%b); break;
  1400. X        case ANDEQ: pop2lv(); set(a&b); break;
  1401. X        case XOREQ: pop2lv(); set(a^b); break;
  1402. X        case OREQ: pop2lv(); set(a|b); break;
  1403. X        case SHLEFTEQ: pop2lv(); set(a<<b); break;
  1404. X        case SHRIGHTEQ: pop2lv(); set(a>>b); break;
  1405. X        case DANDEQ: pop2lv(); set(a&&b); break;
  1406. X        case DOREQ: pop2lv(); set(a||b); break;
  1407. X        case DXOREQ: pop2lv(); set(a&&!b||!a&&b); break;
  1408. X        case COMMA: pop2(); pushv(b); break;
  1409. X        case PREPLUS: stack[sp].val = setvar(stack[sp].lval,
  1410. X            stack[sp].val+1); break;
  1411. X        case PREMINUS: stack[sp].val = setvar(stack[sp].lval,
  1412. X            stack[sp].val-1); break;
  1413. X        default: zerr("out of integers",NULL,0); exit(1);
  1414. X    }
  1415. X}
  1416. X
  1417. Xvoid bop(tk) /**/
  1418. Xint tk;
  1419. X{
  1420. X    switch (tk) {
  1421. X        case DAND: case DANDEQ: if (!stack[sp].val) noeval++; break;
  1422. X        case DOR: case DOREQ: if (stack[sp].val) noeval++; break;
  1423. X        };
  1424. X}
  1425. X
  1426. Xlong mathevall(s,prek,ep) /**/
  1427. Xchar *s;int prek;char **ep;
  1428. X{
  1429. Xint t0;
  1430. X
  1431. X    lastbase = -1;
  1432. X    for (t0 = 0; t0 != LVCOUNT; t0++)
  1433. X        lvals[t0] = NULL;
  1434. X    lvc = 0;
  1435. X    ptr = s;
  1436. X    sp = -1;
  1437. X    unary = 1;
  1438. X    mathparse(prek);
  1439. X    *ep = ptr;
  1440. X    if (sp)
  1441. X        zerr("bad math expression: unbalanced stack",NULL,0);
  1442. X    for (t0 = 0; t0 != lvc; t0++)
  1443. X        free(lvals[t0]);
  1444. X    return stack[0].val;
  1445. X}
  1446. X
  1447. Xlong matheval(s) /**/
  1448. Xchar *s;
  1449. X{
  1450. Xchar *junk;
  1451. Xlong x;
  1452. X
  1453. X    if (!*s)
  1454. X        return 0;
  1455. X    x = mathevall(s,TOPPREC,&junk);
  1456. X    if (*junk)
  1457. X        zerr("bad math expression: illegal character: %c",NULL,*junk);
  1458. X    return x;
  1459. X}
  1460. X
  1461. Xlong mathevalarg(s,ss) /**/
  1462. Xchar *s;char **ss;
  1463. X{
  1464. Xlong x;
  1465. X
  1466. X    x = mathevall(s,ARGPREC,ss);
  1467. X    if (mtok == COMMA)
  1468. X        (*ss)--;
  1469. X    return x;
  1470. X}
  1471. X
  1472. X/* operator-precedence parse the string and execute */
  1473. X
  1474. Xvoid mathparse(pc) /**/
  1475. Xint pc;
  1476. X{
  1477. X    if (errflag)
  1478. X        return;
  1479. X    mtok = zzlex();
  1480. X    while (prec[mtok] <= pc)
  1481. X        {
  1482. X        if (errflag)
  1483. X            return;
  1484. X        if (mtok == NUM)
  1485. X            push(yyval,-1);
  1486. X        else if (mtok == ID)
  1487. X            push(getvar(yylval),yylval);
  1488. X        else if (mtok == M_INPAR)
  1489. X            {
  1490. X            mathparse(TOPPREC);
  1491. X            if (mtok != M_OUTPAR)
  1492. X                exit(1);
  1493. X            }
  1494. X        else if (mtok == QUEST)
  1495. X            {
  1496. X            int q = stack[sp].val;
  1497. X            if (!q) noeval++;
  1498. X            mathparse(prec[QUEST]-1);
  1499. X            if (!q) noeval--; else noeval++;
  1500. X            mathparse(prec[QUEST]);
  1501. X            if (q) noeval--;
  1502. X            op(QUEST);
  1503. X            continue;
  1504. X            }
  1505. X        else
  1506. X            {
  1507. X            int otok = mtok,onoeval = noeval;
  1508. X
  1509. X            if (type[otok] == BOOL)
  1510. X                bop(otok);
  1511. X            mathparse(prec[otok]-(type[otok] != RL));
  1512. X            noeval = onoeval;
  1513. X            op(otok);
  1514. X            continue;
  1515. X            }
  1516. X        mtok = zzlex();
  1517. X        }
  1518. X}
  1519. X
  1520. SHAR_EOF
  1521. chmod 0644 zsh2.2/src/math.c ||
  1522. echo 'restore of zsh2.2/src/math.c failed'
  1523. Wc_c="`wc -c < 'zsh2.2/src/math.c'`"
  1524. test 10185 -eq "$Wc_c" ||
  1525.     echo 'zsh2.2/src/math.c: original size 10185, current size' "$Wc_c"
  1526. rm -f _shar_wnt_.tmp
  1527. fi
  1528. # ============= zsh2.2/src/mem.c ==============
  1529. if test -f 'zsh2.2/src/mem.c' -a X"$1" != X"-c"; then
  1530.     echo 'x - skipping zsh2.2/src/mem.c (File already exists)'
  1531.     rm -f _shar_wnt_.tmp
  1532. else
  1533. > _shar_wnt_.tmp
  1534. echo 'x - extracting zsh2.2/src/mem.c (Text)'
  1535. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.2/src/mem.c' &&
  1536. X/*
  1537. X *
  1538. X * mem.c - memory management
  1539. X *
  1540. X * This file is part of zsh, the Z shell.
  1541. X *
  1542. X * This software is Copyright 1992 by Paul Falstad
  1543. X *
  1544. X * Permission is hereby granted to copy, reproduce, redistribute or otherwise
  1545. X * use this software as long as: there is no monetary profit gained
  1546. X * specifically from the use or reproduction of this software, it is not
  1547. X * sold, rented, traded or otherwise marketed, and this copyright notice is
  1548. X * included prominently in any copy made. 
  1549. X *
  1550. X * The author make no claims as to the fitness or correctness of this software
  1551. X * for any use whatsoever, and it is provided as is. Any use of this software
  1552. X * is at the user's own risk. 
  1553. X *
  1554. X */
  1555. X/*
  1556. X
  1557. X    mem.c - memory management
  1558. X
  1559. X    This file is part of zsh, the Z shell.
  1560. X
  1561. X    zsh is free software; no one can prevent you from reading the source
  1562. X   code, or giving it to someone else.
  1563. X
  1564. X   This file is copyrighted under the GNU General Public License, which
  1565. X   can be found in the file called COPYING.
  1566. X
  1567. X   Copyright (C) 1990, 1991 Paul Falstad
  1568. X
  1569. X*/
  1570. X
  1571. X#include "zsh.h"
  1572. X#define HEAPSIZE 8192
  1573. X
  1574. X/*
  1575. X
  1576. X    There are two ways to allocate memory in zsh.  The first way is
  1577. X    to call zalloc/zcalloc, which call malloc/calloc directly.  It
  1578. X    is legal to call realloc() or free() on memory allocated this way.
  1579. X    The second way is to call halloc/hcalloc, which allocates memory
  1580. X    from one of the memory pools on the heap stack.  A pool can be
  1581. X    created by calling pushheap(), and destroyed by calling popheap().
  1582. X    To free the memory in the pool without destroying it, call
  1583. X    freeheap(); this is equivalent to { popheap(); pushheap(); }
  1584. X    Memory allocated in this way does not have to be freed explicitly;
  1585. X    it will all be freed when the pool is destroyed.  In fact,
  1586. X    attempting to free this memory may result in a core dump.
  1587. X    The pair of pointers ncalloc and alloc may point to either
  1588. X    zalloc & zcalloc or halloc & hcalloc; permalloc() sets them to the
  1589. X    former, and heapalloc() sets them to the latter. This can be useful.
  1590. X    For example, the dupstruct() routine duplicates a syntax tree,
  1591. X    allocating the new memory for the tree using alloc().  If you want
  1592. X    to duplicate a structure for a one-time use (i.e. to execute the list
  1593. X    in a for loop), call heapalloc(), then dupstruct().  If you want
  1594. X    to duplicate a structure in order to preserve it (i.e. a function
  1595. X    definition), call permalloc(), then dupstruct().
  1596. X
  1597. X*/
  1598. X
  1599. X/* initialize heap stack */
  1600. X
  1601. Xvoid meminit() /**/
  1602. X{
  1603. X    permalloc();
  1604. X    heaplist = newlist();
  1605. X    pushheap();
  1606. X}
  1607. X
  1608. X/* set default allocation to heap stack */
  1609. X
  1610. Xvoid heapalloc() /**/
  1611. X{
  1612. X    alloc = hcalloc;
  1613. X    ncalloc = halloc;
  1614. X    useheap = 1;
  1615. X}
  1616. X
  1617. Xstatic vptr (*lastcalloc) DCLPROTO((int));
  1618. Xstatic vptr (*lastncalloc) DCLPROTO((int));
  1619. X
  1620. X/* set default allocation to malloc() */
  1621. X
  1622. Xvoid permalloc() /**/
  1623. X{
  1624. X    lastcalloc = alloc;
  1625. X    lastncalloc = ncalloc;
  1626. X    alloc = zcalloc;
  1627. X    ncalloc = zalloc;
  1628. X    useheap = 0;
  1629. X}
  1630. X
  1631. X/* reset previous default allocation */
  1632. X
  1633. Xvoid lastalloc() /**/
  1634. X{
  1635. X    alloc = lastcalloc;
  1636. X    ncalloc = lastncalloc;
  1637. X}
  1638. X
  1639. Xstruct heap {
  1640. X    char *pool,*ptr;
  1641. X    int free;
  1642. X    struct heap *next;
  1643. X    };
  1644. X
  1645. X/* create a memory pool */
  1646. X
  1647. Xvoid pushheap() /**/
  1648. X{
  1649. XHeap h;
  1650. X
  1651. X    h = (Heap) zalloc(sizeof *h);
  1652. X    h->pool = h->ptr = zalloc(HEAPSIZE);
  1653. X    h->free = HEAPSIZE;
  1654. X    h->next = NULL;
  1655. X    permalloc();
  1656. X    pushnode(heaplist,h);
  1657. X    lastalloc();
  1658. X}
  1659. X
  1660. X/* reset a memory pool */
  1661. X
  1662. Xvoid freeheap() /**/
  1663. X{
  1664. XHeap h = (Heap) peekfirst(heaplist);
  1665. X
  1666. X    freeh(h->next);
  1667. X    h->next = NULL;
  1668. X    h->free += (h->ptr-h->pool);
  1669. X    h->ptr = h->pool;
  1670. X}
  1671. X
  1672. X/* destroy a memory pool */
  1673. X
  1674. Xvoid popheap() /**/
  1675. X{
  1676. XHeap h = (Heap) getnode(heaplist);
  1677. X
  1678. X    freeh(h);
  1679. X}
  1680. X
  1681. Xvoid freeh(h) /**/
  1682. XHeap h;
  1683. X{
  1684. X    if (h)
  1685. X        {
  1686. X        freeh(h->next);
  1687. X        free(h->pool);
  1688. X        free(h);
  1689. X        }
  1690. X}
  1691. X
  1692. X/* allocate memory from the current memory pool */
  1693. X
  1694. Xvptr halloc(size) /**/
  1695. Xint size;
  1696. X{
  1697. XHeap h = (Heap) peekfirst(heaplist),h2;
  1698. Xchar *ret;
  1699. X
  1700. X    size = (size|7)+1;
  1701. X    while (h && h->free-size < 0)
  1702. X        h = h->next;
  1703. X    if (!h) {
  1704. X        h2 = (Heap) zalloc(sizeof *h2);
  1705. X        h2->pool = h2->ptr = zalloc(h2->free = 
  1706. X            (size < HEAPSIZE) ? HEAPSIZE : (size|(HEAPSIZE-1))+1);
  1707. X        h2->next = (Heap) peekfirst(heaplist);
  1708. X        setdata(firstnode(heaplist),(vptr) h2);
  1709. X        h = h2;
  1710. X    }
  1711. X    h->free -= size;
  1712. X    ret = h->ptr;
  1713. X    h->ptr += size;
  1714. X    return ret;
  1715. X}
  1716. X
  1717. X/* allocate memory from the current memory pool and clear it */
  1718. X
  1719. Xvptr hcalloc(size) /**/
  1720. Xint size;
  1721. X{
  1722. Xvptr ptr;
  1723. X
  1724. X    ptr = halloc(size);
  1725. X    memset(ptr,0,size);
  1726. X    return ptr;
  1727. X}
  1728. X
  1729. Xvptr hrealloc(p,old,new) /**/
  1730. Xchar *p;int old;int new;
  1731. X{
  1732. Xchar *ptr;
  1733. X
  1734. X    ptr = halloc(new);
  1735. X    memcpy(ptr,p,old);
  1736. X    return ptr;
  1737. X}
  1738. X
  1739. X/* allocate permanent memory */
  1740. X
  1741. Xvptr zalloc(l) /**/
  1742. Xint l;
  1743. X{
  1744. Xvptr z;
  1745. X    if (!l) l = 1;
  1746. X    if (!(z = malloc(l)))
  1747. X        {
  1748. X        zerr("fatal error: out of memory",NULL,0);
  1749. X        exit(1);
  1750. X        }
  1751. X    return z;
  1752. X}
  1753. X
  1754. Xvptr zcalloc(size) /**/
  1755. Xint size;
  1756. X{
  1757. Xvptr ptr;
  1758. X
  1759. X    ptr = zalloc(size);
  1760. X    memset(ptr,0,size);
  1761. X    return ptr;
  1762. X}
  1763. X
  1764. Xchar *strdup(s) /**/
  1765. Xchar *s;
  1766. X{
  1767. Xchar *t;
  1768. X
  1769. X    if (!s)
  1770. X        return NULL;
  1771. X    t = ncalloc(strlen(s)+1);
  1772. X    strcpy(t,s);
  1773. X    return t;
  1774. X}
  1775. X
  1776. Xchar *ztrdup(s) /**/
  1777. Xchar *s;
  1778. X{
  1779. Xchar *t;
  1780. X
  1781. X    if (!s)
  1782. X        return NULL;
  1783. X    t = zalloc(strlen(s)+1);
  1784. X    strcpy(t,s);
  1785. X    return t;
  1786. X}
  1787. X
  1788. SHAR_EOF
  1789. chmod 0644 zsh2.2/src/mem.c ||
  1790. echo 'restore of zsh2.2/src/mem.c failed'
  1791. Wc_c="`wc -c < 'zsh2.2/src/mem.c'`"
  1792. test 4948 -eq "$Wc_c" ||
  1793.     echo 'zsh2.2/src/mem.c: original size 4948, current size' "$Wc_c"
  1794. rm -f _shar_wnt_.tmp
  1795. fi
  1796. # ============= zsh2.2/src/params.c ==============
  1797. if test -f 'zsh2.2/src/params.c' -a X"$1" != X"-c"; then
  1798.     echo 'x - skipping zsh2.2/src/params.c (File already exists)'
  1799.     rm -f _shar_wnt_.tmp
  1800. else
  1801. > _shar_wnt_.tmp
  1802. echo 'x - extracting zsh2.2/src/params.c (Text)'
  1803. sed 's/^X//' << 'SHAR_EOF' > 'zsh2.2/src/params.c' &&
  1804. X/*
  1805. X *
  1806. X * params.c - parameters
  1807. X *
  1808. X * This file is part of zsh, the Z shell.
  1809. X *
  1810. X * This software is Copyright 1992 by Paul Falstad
  1811. X *
  1812. X * Permission is hereby granted to copy, reproduce, redistribute or otherwise
  1813. X * use this software as long as: there is no monetary profit gained
  1814. X * specifically from the use or reproduction of this software, it is not
  1815. X * sold, rented, traded or otherwise marketed, and this copyright notice is
  1816. X * included prominently in any copy made. 
  1817. X *
  1818. X * The author make no claims as to the fitness or correctness of this software
  1819. X * for any use whatsoever, and it is provided as is. Any use of this software
  1820. X * is at the user's own risk. 
  1821. X *
  1822. X */
  1823. X
  1824. X#include "zsh.h"
  1825. X#include <pwd.h>
  1826. X
  1827. X#define new(X) (X=(vptr)alloc(sizeof(*(X))))
  1828. X
  1829. Xstatic Param argvparam;
  1830. X
  1831. Xstruct iparam {
  1832. X    struct hashnode *next; int canfree; char *nam; /* hash data */
  1833. X    void *value;
  1834. X    int (*func1)(); /* set func */
  1835. X    int (*func2)(); /* get func */
  1836. X    int ct;                /* output base or field width */
  1837. X    int flags;
  1838. X    vptr data;            /* used by getfns */
  1839. X    char *env;            /* location in environment, if exported */
  1840. X    char *ename;        /* name of corresponding environment var */
  1841. X    };
  1842. X
  1843. X#define IFN(X) ((int (*)())(X))
  1844. X
  1845. X/* put predefined params in hash table */
  1846. X
  1847. Xvoid setupparams() /**/
  1848. X{
  1849. Xstatic struct iparam pinit[] = {
  1850. X#define IPDEF1(A,B,C,D) {NULL,0,A,NULL,IFN(C),IFN(B),10,\
  1851. X        PMFLAG_i|PMFLAG_SPECIAL|D,NULL,NULL,NULL}
  1852. X    IPDEF1("#",poundgetfn,IFN(nullsetfn),PMFLAG_r),
  1853. X    IPDEF1("ARGC",poundgetfn,IFN(nullsetfn),PMFLAG_r),
  1854. X    IPDEF1("ERRNO",errnogetfn,IFN(nullsetfn),PMFLAG_r),
  1855. X    IPDEF1("GID",gidgetfn,IFN(nullsetfn),PMFLAG_r),
  1856. X    IPDEF1("HISTSIZE",histsizegetfn,histsizesetfn,0),
  1857. X    IPDEF1("LITHISTSIZE",lithistsizegetfn,lithistsizesetfn,0),
  1858. X    IPDEF1("RANDOM",randomgetfn,randomsetfn,0),
  1859. X    IPDEF1("SECONDS",secondsgetfn,secondssetfn,0),
  1860. X    IPDEF1("UID",uidgetfn,IFN(nullsetfn),PMFLAG_r),
  1861. X
  1862. X#define IPDEF2(A,B,C,D) {NULL,0,A,NULL,IFN(C),IFN(B),0,\
  1863. X        PMFLAG_SPECIAL|D,NULL,NULL,NULL}
  1864. X    IPDEF2("-",dashgetfn,IFN(nullsetfn),PMFLAG_r),
  1865. X    IPDEF2("HISTCHARS",histcharsgetfn,histcharssetfn,0),
  1866. X    IPDEF2("HOME",homegetfn,homesetfn,0),
  1867. X    IPDEF2("TERM",termgetfn,termsetfn,0),
  1868. X    IPDEF2("WORDCHARS",wordcharsgetfn,wordcharssetfn,0),
  1869. X    IPDEF2("IFS",ifsgetfn,ifssetfn,0),
  1870. X    IPDEF2("_",underscoregetfn,IFN(nullsetfn),PMFLAG_r),
  1871. X
  1872. X#define IPDEF3(A,B) {NULL,0,A,NULL,IFN(nullsetfn),IFN(strconstgetfn),0,PMFLAG_r|\
  1873. X        PMFLAG_SPECIAL,(vptr)B,NULL,NULL}
  1874. X    IPDEF3("HOSTTYPE",HOSTTYPE),
  1875. X    IPDEF3("VERSION",VERSIONSTR),
  1876. X
  1877. X#define IPDEF4(A,B) {NULL,0,A,NULL,IFN(nullsetfn),IFN(intvargetfn),10,\
  1878. X        PMFLAG_r|PMFLAG_i|PMFLAG_SPECIAL,(vptr)B,NULL,NULL}
  1879. X    IPDEF4("!",&lastpid),
  1880. X    IPDEF4("$",&mypid),
  1881. X    IPDEF4("?",&lastval),
  1882. X    IPDEF4("status",&lastval),
  1883. X    IPDEF4("LINENO",&lineno),
  1884. X    IPDEF4("PPID",&ppid),
  1885. X
  1886. X#define IPDEF5(A,B) {NULL,0,A,NULL,IFN(intvarsetfn),IFN(intvargetfn),10,\
  1887. X        PMFLAG_i|PMFLAG_SPECIAL,(vptr)B,NULL,NULL}
  1888. X    IPDEF5("BAUD",&baud),
  1889. X    IPDEF5("COLUMNS",&columns),
  1890. X    IPDEF5("DIRSTACKSIZE",&dirstacksize),
  1891. X    IPDEF5("LINES",&lines),
  1892. X    IPDEF5("LISTMAX",&listmax),
  1893. X    IPDEF5("LOGCHECK",&logcheck),
  1894. X    IPDEF5("MAILCHECK",&mailcheck),
  1895. X    IPDEF5("OPTIND",&zoptind),
  1896. X    IPDEF5("PERIOD",&period),
  1897. X    IPDEF5("REPORTTIME",&reporttime),
  1898. X    IPDEF5("SAVEHIST",&savehist),
  1899. X    IPDEF5("SHLVL",&shlvl),
  1900. X    IPDEF5("TMOUT",&tmout),
  1901. X
  1902. X#define IPDEF6(A,B) {NULL,0,A,NULL,IFN(nullsetfn),IFN(strvargetfn),0,\
  1903. X        PMFLAG_r|PMFLAG_SPECIAL,(vptr)B,NULL,NULL}
  1904. X    IPDEF6("LOGNAME",&logname),
  1905. X    IPDEF6("PWD",&pwd),
  1906. X    IPDEF6("TTY",&ttystrname),
  1907. X    IPDEF6("USERNAME",&username),
  1908. X
  1909. X#define IPDEF7(A,B) {NULL,0,A,NULL,IFN(strvarsetfn),IFN(strvargetfn),0,\
  1910. X        PMFLAG_SPECIAL,(vptr)B,NULL,NULL}
  1911. X    IPDEF7("FCEDIT",&fceditparam),
  1912. X    IPDEF7("HOST",&hostnam),
  1913. X    IPDEF7("OLDPWD",&oldpwd),
  1914. X    IPDEF7("OPTARG",&optarg),
  1915. X    IPDEF7("MAIL",&mailfile),
  1916. X    IPDEF7("NULLCMD",&nullcmd),
  1917. X    IPDEF7("POSTEDIT",&postedit),
  1918. X    IPDEF7("prompt",&prompt),
  1919. X    IPDEF7("PROMPT",&prompt),
  1920. X    IPDEF7("PROMPT2",&prompt2),
  1921. X    IPDEF7("PROMPT3",&prompt3),
  1922. X    IPDEF7("PROMPT4",&prompt4),
  1923. X    IPDEF7("READNULLCMD",&readnullcmd),
  1924. X    IPDEF7("RPROMPT",&rprompt),
  1925. X    IPDEF7("PS1",&prompt),
  1926. X    IPDEF7("PS2",&prompt2),
  1927. X    IPDEF7("PS3",&prompt3),
  1928. X    IPDEF7("PS4",&prompt4),
  1929. X    IPDEF7("RPS1",&rprompt),
  1930. X    IPDEF7("SPROMPT",&sprompt),
  1931. X    IPDEF7("TIMEFMT",&timefmt),
  1932. X    IPDEF7("TMPPREFIX",&tmpprefix),
  1933. X    IPDEF7("WATCHFMT",&watchfmt),
  1934. X    IPDEF7("0",&argzero),
  1935. X
  1936. X#define IPDEF8(A,B,C) {NULL,0,A,NULL,IFN(colonarrsetfn),IFN(colonarrgetfn),0,\
  1937. X        PMFLAG_SPECIAL,(vptr)C,NULL,B}
  1938. X    IPDEF8("CDPATH","cdpath",&cdpath),
  1939. X    IPDEF8("FIGNORE","fignore",&fignore),
  1940. X    IPDEF8("FPATH","fpath",&fpath),
  1941. X    IPDEF8("MAILPATH","mailpath",&mailpath),
  1942. X    IPDEF8("MANPATH","manpath",&manpath),
  1943. X    IPDEF8("WATCH","watch",&watch),
  1944. X    IPDEF8("HOSTS","hosts",&hosts),
  1945. X    IPDEF8("PATH",NULL,NULL),
  1946. X
  1947. X#define IPDEF9(A,B,C) {NULL,0,A,NULL,IFN(arrvarsetfn),IFN(arrvargetfn),0,\
  1948. X        PMFLAG_A|PMFLAG_SPECIAL|C,(vptr)B,NULL,NULL}
  1949. X    IPDEF9("cdpath",&cdpath,0),
  1950. X    IPDEF9("fignore",&fignore,0),
  1951. X    IPDEF9("fpath",&fpath,0),
  1952. X    IPDEF9("mailpath",&mailpath,0),
  1953. X    IPDEF9("manpath",&manpath,0),
  1954. X    IPDEF9("watch",&watch,0),
  1955. X    IPDEF9("hosts",&hosts,0),
  1956. X    IPDEF9("signals",&sigptr,PMFLAG_r),
  1957. X    IPDEF9("argv",&pparams,0),
  1958. X    IPDEF9("*",&pparams,0),
  1959. X    IPDEF9("@",&pparams,0),
  1960. X
  1961. X#define IPDEF10(A,C,D) {NULL,0,A,NULL,IFN(D),IFN(C),0,\
  1962. X        PMFLAG_A|PMFLAG_SPECIAL,NULL,NULL,NULL}
  1963. X    IPDEF10("path",pathgetfn,pathsetfn),
  1964. X    IPDEF10("hostcmds",nullgetfn,hostcmdssetfn),
  1965. X    IPDEF10("optcmds",nullgetfn,optcmdssetfn),
  1966. X    IPDEF10("bindcmds",nullgetfn,bindcmdssetfn),
  1967. X    IPDEF10("varcmds",nullgetfn,varcmdssetfn),
  1968. X    {NULL,}
  1969. X    };
  1970. Xstruct iparam *ip;
  1971. X
  1972. X    for (ip = pinit; ip->nam; ip++) addhperm(ip->nam,ip,paramtab,NULL);
  1973. X    argvparam = gethnode("argv",paramtab);
  1974. X}
  1975. X
  1976. Xstatic int unsetflag;
  1977. X
  1978. Xstruct param *createparam(name,value,flags) /**/
  1979. Xchar *name;vptr value;int flags;
  1980. X{
  1981. Xstruct param *pm;
  1982. Xchar buf[20];
  1983. X
  1984. X    pm = zcalloc(sizeof *pm);
  1985. X    if (isset(ALLEXPORT))
  1986. X        flags |= PMFLAG_x;
  1987. X    pm->flags = flags;
  1988. X    if ((flags & PMTYPE) == PMFLAG_s) {
  1989. X        pm->u.str = value;
  1990. X        pm->sets.cfn = strsetfn;
  1991. X        pm->gets.cfn = strgetfn;
  1992. X    } else if ((flags & PMTYPE) == PMFLAG_A) {
  1993. X        pm->u.arr = value;
  1994. X        pm->sets.afn = arrsetfn;
  1995. X        pm->gets.afn = arrgetfn;
  1996. X    } else {
  1997. X        pm->u.val = (value) ? matheval(value) : 0;
  1998. X        pm->sets.ifn = intsetfn;
  1999. X        pm->gets.ifn = intgetfn;
  2000. X        sprintf(buf,"%ld",pm->u.val);
  2001. X        value = buf;
  2002. X    }
  2003. X    if (flags & PMFLAG_x)
  2004. X        pm->env = addenv(name,value);
  2005. X    addhnode(ztrdup(name),pm,paramtab,freepm);
  2006. X    return pm;
  2007. X}
  2008. X
  2009. Xint isident(s) /**/
  2010. Xchar *s;
  2011. X{
  2012. Xchar *ss;
  2013. X
  2014. X    for (ss = s; *ss; ss++) if (!iident(*ss)) break;
  2015. X    if (!*ss || *ss == '[') return 1;
  2016. X    if (*s == Quest)
  2017. X        *s = '?';
  2018. X    else if (*s == Pound)
  2019. X        *s = '#';
  2020. X    else if (*s == String || *s == Qstring)
  2021. X        *s = '$';
  2022. X    else if (*s == Star)
  2023. X        *s = '*';
  2024. X    if (*s == '#' || *s == '-' || *s == '?' || *s == '$' || *s == '_' ||
  2025. X         *s == '!' || *s == '@' || *s == '*')
  2026. X        return 1;
  2027. X    return 0;
  2028. X}
  2029. X
  2030. XValue getvalue(pptr,bracks) /**/
  2031. Xchar **pptr;int bracks;
  2032. X{
  2033. Xchar *s = *pptr,*t = *pptr;
  2034. Xchar sav;
  2035. XValue v;
  2036. X
  2037. X    if (idigit(*s)) while (idigit(*s)) s++;
  2038. X    else if (iident(*s)) while (iident(*s)) s++;
  2039. X    else if (*s == Quest) *s++ = '?';
  2040. X    else if (*s == Pound) *s++ = '#';
  2041. X    else if (*s == String) *s++ = '$';
  2042. X    else if (*s == Qstring) *s++ = '$';
  2043. X    else if (*s == Star) *s++ = '*';
  2044. X    else if (*s == '#' || *s == '-' || *s == '?' || *s == '$' ||
  2045. X                *s == '_' || *s == '!' || *s == '@' || *s == '*') s++;
  2046. X    else return NULL;
  2047. X    if (sav = *s) *s = '\0';
  2048. X    if (idigit(*t) && *t != '0') {
  2049. X        v = (Value) hcalloc(sizeof *v);
  2050. X        v->pm = argvparam;
  2051. X        v->a = v->b = atoi(t)-1;
  2052. X        if (sav)
  2053. X            *s = sav;
  2054. X    } else {
  2055. X        struct param *pm;
  2056. X        int isvarat = !strcmp(t, "@");
  2057. X
  2058. X        pm = gethnode(t,paramtab);
  2059. X        if (sav)
  2060. X            *s = sav;
  2061. X        *pptr = s;
  2062. X        if (!pm)
  2063. X            return NULL;
  2064. X        v = hcalloc(sizeof *v);
  2065. X        if (pmtype(pm) == PMFLAG_A)
  2066. X            v->isarr = isvarat ? -1 : 1;
  2067. X        v->pm = pm;
  2068. X        v->a = 0; v->b = -1;
  2069. X        if (bracks && (*s == '[' || *s == Inbrack)) {
  2070. X            int a,b;
  2071. X            char *olds = s,*t;
  2072. X
  2073. X            *s++ = '[';
  2074. X            for (t = s; *t && *t != ']' && *t != Outbrack; t++)
  2075. X                if (itok(*t))
  2076. X                    *t = ztokens[*t-Pound];
  2077. X            if (*t == Outbrack)
  2078. X                *t = ']';
  2079. X            if ((s[0] == '*' || s[0] == '@')  && s[1] == ']') {
  2080. X                if (v->isarr) v->isarr = (s[0] == '*') ? 1 : -1;
  2081. X                v->a = 0;
  2082. X                v->b = -1;
  2083. X                s += 2;
  2084. X            } else {
  2085. X                a = mathevalarg(s,&s);
  2086. X                if (a > 0) a--;
  2087. X                if (*s == ',' || *s == Comma) {
  2088. X                    s++;
  2089. X                    b = mathevalarg(s,&s);
  2090. X                    if (b > 0) b--;
  2091. X                } else
  2092. X                    b = a;
  2093. X                if (*s == ']') {
  2094. X                    s++;
  2095. X                    if (v->isarr && a == b)
  2096. X                        v->isarr = 0;
  2097. X                    v->a = a;
  2098. X                    v->b = b;
  2099. X                } else
  2100. X                    s = olds;
  2101. X            }
  2102. X        }
  2103. X    }
  2104. X    if (!bracks && *s)
  2105. X        return NULL;
  2106. X    *pptr = s;
  2107. X    return v;
  2108. X}
  2109. X
  2110. Xchar *getstrvalue(v) /**/
  2111. XValue v;
  2112. X{
  2113. Xchar *s,**ss;
  2114. Xstatic char buf[20];
  2115. X
  2116. X    if (!v)
  2117. X        return "";
  2118. X    if (pmtype(v->pm) != PMFLAG_A) {
  2119. X        if ((pmtype(v->pm) == PMFLAG_i))
  2120. X            convbase(s = buf,v->pm->gets.ifn(v->pm),v->pm->ct);
  2121. X        else
  2122. X            s = v->pm->gets.cfn(v->pm);
  2123. X        if (v->a == 0 && v->b == -1) return s;
  2124. X        if (v->a < 0) v->a += strlen(s);
  2125. X        if (v->b < 0) v->b += strlen(s);
  2126. X        s = (v->a > strlen(s)) ? strdup("") : strdup(s+v->a);
  2127. X        if (v->b < v->a) s[0] = '\0';
  2128. X        else if (v->b-v->a < strlen(s)) s[v->b-v->a+1] = '\0';
  2129. X        return s;
  2130. X    }
  2131. X    if (v->isarr) return spacejoin(v->pm->gets.afn(v->pm));
  2132. X
  2133. X    ss = v->pm->gets.afn(v->pm);
  2134. X    if (v->a < 0) v->a += arrlen(ss);
  2135. X    s = (v->a >= arrlen(ss) || v->a < 0) ? "" : ss[v->a];
  2136. X    return s;
  2137. X}
  2138. X
  2139. Xchar **getarrvalue(v) /**/
  2140. XValue v;
  2141. X{
  2142. Xchar **s;
  2143. Xstatic char *nular[] = { "", NULL };
  2144. X
  2145. X    if (!v)
  2146. X        return arrdup(nular);
  2147. X    s = v->pm->gets.afn(v->pm);
  2148. X    if (v->a == 0 && v->b == -1) return s;
  2149. X    if (v->a < 0) v->a += arrlen(s);
  2150. X    if (v->b < 0) v->b += arrlen(s);
  2151. X    if (v->a > arrlen(s) || v->a < 0)
  2152. X        s = arrdup(nular);
  2153. X    else
  2154. X        s = arrdup(s)+v->a;
  2155. X    if (v->b < v->a) s[0] = NULL;
  2156. X    else if (v->b-v->a < arrlen(s)) s[v->b-v->a+1] = NULL;
  2157. X    return s;
  2158. X}
  2159. X
  2160. Xlong getintvalue(v) /**/
  2161. XValue v;
  2162. X{
  2163. Xchar **ss;
  2164. X
  2165. X    if (!v || v->isarr)
  2166. X        return 0;
  2167. X    if (pmtype(v->pm) != PMFLAG_A) {
  2168. X        if (pmtype(v->pm) == PMFLAG_i)
  2169. X            return v->pm->gets.ifn(v->pm);
  2170. X        return atol(v->pm->gets.cfn(v->pm));
  2171. X    }
  2172. X    ss = v->pm->gets.afn(v->pm);
  2173. X    if (v->a < 0) v->a += arrlen(ss);
  2174. X    if (v->a < 0 || v->a > arrlen(ss)) return 0;
  2175. X    return atol(ss[v->a]);
  2176. X}
  2177. X
  2178. Xvoid setstrvalue(v,val) /**/
  2179. XValue v;char *val;
  2180. X{
  2181. Xchar *s;
  2182. X
  2183. X    if (v->pm->flags & PMFLAG_r) {
  2184. X        free(val);
  2185. X        return;
  2186. X    }
  2187. X    if ((s = v->pm->env) && val)
  2188. X        v->pm->env = replenv(v->pm->env,val);
  2189. X    switch (pmtype(v->pm)) {
  2190. X        case PMFLAG_s:
  2191. X            if (v->a == 0 && v->b == -1)
  2192. X                (v->pm->sets.cfn)(v->pm,val);
  2193. X            else {
  2194. X                char *z,*y,*x;
  2195. X
  2196. X                z = strdup((v->pm->gets.cfn)(v->pm));
  2197. X                if (v->a < 0) {
  2198. X                    v->a += strlen(z);
  2199. X                    if (v->a < 0) v->a = 0;
  2200. X                }
  2201. X                if (v->a > strlen(z)) v->a = strlen(z);
  2202. X                if (v->b < 0) v->b += strlen(z);
  2203. X                if (v->b < v->a) v->b = v->a;
  2204. X                z[v->a] = '\0';
  2205. X                y = z+v->b+1;
  2206. X                x = zalloc(strlen(z)+strlen(y)+strlen(val)+1);
  2207. X                strcpy(x,z);
  2208. X                strcat(x,val);
  2209. X                strcat(x,y);
  2210. X                (v->pm->sets.cfn)(v->pm,x);
  2211. X            }
  2212. X            if (v->pm->flags & (PMFLAG_L|PMFLAG_R|PMFLAG_Z) && !v->pm->ct)
  2213. X                v->pm->ct = strlen(val);
  2214. X            break;
  2215. X        case PMFLAG_i:
  2216. X            (v->pm->sets.ifn)(v->pm,matheval(val));
  2217. X            if (!v->pm->ct && lastbase != 1)
  2218. X                v->pm->ct = lastbase;
  2219. X            free(val);
  2220. X            break;
  2221. X        case PMFLAG_A:
  2222. X            if (v->a != v->b)
  2223. X                zerr("illegal array assignment",NULL,0);
  2224. X            else {
  2225. X                char **ss = (v->pm->gets.afn)(v->pm);
  2226. X                int ac,ad,t0;
  2227. X
  2228. X                ac = arrlen(ss);
  2229. X                if (v->a < 0) {
  2230. X                    v->a += ac;
  2231. X                    if (v->a < 0) v->a = 0;
  2232. X                }
  2233. X                if (v->a >= ac) {
  2234. X                    char **st = ss;
  2235. X
  2236. X                    ad = v->a+1;
  2237. X                    ss = zalloc((ad+1)*sizeof *ss);
  2238. X                    memcpy(ss,st,(ad+1)*sizeof *ss);
  2239. X                    for (t0 = 0; t0 != ac; t0++)
  2240. X                        ss[t0] = ztrdup(ss[t0]);
  2241. X                    while (ac < ad)
  2242. X                        ss[ac++] = ztrdup("");
  2243. X                    ss[ac] = NULL;
  2244. X                }
  2245. X                if (ss[v->a]) free(ss[v->a]);
  2246. X                ss[v->a] = val;
  2247. X                (v->pm->sets.afn)(v->pm,ss);
  2248. X            }
  2249. X            break;
  2250. X    }
  2251. X}
  2252. X
  2253. Xvoid setintvalue(v,val) /**/
  2254. XValue v;long val;
  2255. X{
  2256. Xchar buf[20];
  2257. X
  2258. X    if (v->pm->flags & PMFLAG_r)
  2259. X        return;
  2260. X    if (v->pm->env) {
  2261. X        sprintf(buf,"%ld",val);
  2262. X        v->pm->env = replenv(v->pm->env,buf);
  2263. X    }
  2264. X    switch (pmtype(v->pm))
  2265. X        {
  2266. X        case PMFLAG_s:
  2267. X            sprintf(buf,"%ld",val);
  2268. X            (v->pm->sets.cfn)(v->pm,ztrdup(buf));
  2269. X            break;
  2270. X        case PMFLAG_i:
  2271. SHAR_EOF
  2272. true || echo 'restore of zsh2.2/src/params.c failed'
  2273. fi
  2274. echo 'End of zsh2.2 part 10'
  2275. echo 'File zsh2.2/src/params.c is continued in part 11'
  2276. echo 11 > _shar_seq_.tmp
  2277. exit 0
  2278.  
  2279. exit 0 # Just in case...
  2280.